package com.smart.community.complaint.dto;

import com.smart.community.commons.base.BaseDTO;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.*;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 投诉建议数据传输对象
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-06-26
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class ComplaintDTO extends BaseDTO {

    /**
     * 用户ID
     */
    @NotNull(message = "用户ID不能为空")
    private Long userId;

    /**
     * 社区ID
     */
    @NotNull(message = "社区ID不能为空")
    private Long communityId;

    /**
     * 投诉标题
     */
    @NotBlank(message = "投诉标题不能为空")
    @Size(max = 200, message = "投诉标题长度不能超过200个字符")
    private String title;

    /**
     * 投诉描述
     */
    @NotBlank(message = "投诉描述不能为空")
    @Size(max = 2000, message = "投诉描述长度不能超过2000个字符")
    private String description;

    /**
     * 投诉分类编码
     */
    @NotBlank(message = "投诉分类不能为空")
    private String categoryCode;

    /**
     * 投诉位置
     */
    @Size(max = 500, message = "投诉位置长度不能超过500个字符")
    private String location;

    /**
     * 联系电话
     */
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "联系电话格式不正确")
    private String contactPhone;

    /**
     * 紧急程度：1-低，2-中，3-高，4-紧急
     */
    @NotNull(message = "紧急程度不能为空")
    @Min(value = 1, message = "紧急程度值无效")
    @Max(value = 4, message = "紧急程度值无效")
    private Integer urgency;

    /**
     * 期望解决时间
     */
    @Future(message = "期望解决时间必须是未来时间")
    private LocalDateTime expectedSolveTime;

    /**
     * 是否匿名投诉
     */
    private Boolean isAnonymous = false;

    /**
     * 图片列表
     */
    private List<String> images;

    /**
     * 处理人ID
     */
    private Long handlerId;

    /**
     * 处理步骤
     */
    @Size(max = 1000, message = "处理步骤长度不能超过1000个字符")
    private String processStep;

    /**
     * 处理结果
     */
    @Size(max = 1000, message = "处理结果长度不能超过1000个字符")
    private String processResult;

    /**
     * 解决方案
     */
    @Size(max = 2000, message = "解决方案长度不能超过2000个字符")
    private String solution;

    /**
     * 满意度评分：1-5分
     */
    @Min(value = 1, message = "满意度评分不能小于1")
    @Max(value = 5, message = "满意度评分不能大于5")
    private Integer satisfactionRate;

    /**
     * 回访结果
     */
    @Size(max = 1000, message = "回访结果长度不能超过1000个字符")
    private String followupResult;

    /**
     * 备注
     */
    @Size(max = 1000, message = "备注长度不能超过1000个字符")
    private String remark;

    /**
     * 验证投诉提交参数
     * 
     * @return 是否有效
     */
    public boolean validateSubmit() {
        return userId != null && communityId != null 
            && title != null && !title.trim().isEmpty()
            && description != null && !description.trim().isEmpty()
            && categoryCode != null && !categoryCode.trim().isEmpty()
            && urgency != null && urgency >= 1 && urgency <= 4;
    }

    /**
     * 验证投诉处理参数
     * 
     * @return 是否有效
     */
    public boolean validateHandle() {
        return handlerId != null 
            && processStep != null && !processStep.trim().isEmpty()
            && processResult != null && !processResult.trim().isEmpty();
    }

    /**
     * 验证回访参数
     * 
     * @return 是否有效
     */
    public boolean validateFollowup() {
        return satisfactionRate != null && satisfactionRate >= 1 && satisfactionRate <= 5
            && followupResult != null && !followupResult.trim().isEmpty();
    }

    /**
     * 获取紧急程度名称
     * 
     * @return 紧急程度名称
     */
    public String getUrgencyName() {
        if (urgency == null) return null;
        
        switch (urgency) {
            case 1: return "低";
            case 2: return "中";
            case 3: return "高";
            case 4: return "紧急";
            default: return "未知";
        }
    }

    /**
     * 计算期望解决时间（如果未设置）
     * 
     * @return 期望解决时间
     */
    public LocalDateTime calculateExpectedSolveTime() {
        if (expectedSolveTime != null) {
            return expectedSolveTime;
        }
        
        // 根据紧急程度设置默认解决时间
        LocalDateTime now = LocalDateTime.now();
        
        switch (urgency) {
            case 1: return now.plusDays(7);  // 低紧急度：7天
            case 2: return now.plusDays(3);  // 中紧急度：3天
            case 3: return now.plusDays(1);  // 高紧急度：1天
            case 4: return now.plusHours(4); // 紧急：4小时
            default: return now.plusDays(3);
        }
    }
}
